package com.czk.utils;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.util.ASMifier;
import org.objectweb.asm.util.Printer;
import org.objectweb.asm.util.Textifier;
import org.objectweb.asm.util.TraceClassVisitor;

import java.io.IOException;
import java.io.PrintWriter;

/**
 * 对一个类生成ASM代码
 *
 * @Author:ChenZhangKun
 * @Date: 2021/7/20 16:38
 */
public class ASMPrint {
    public static void main(String[] args) throws IOException {
        // className值设置为类的全限定名，可以是我们自己写的类
        String className = "java.lang.String";
        // parsingOptions值设置为ClassReader.SKIP_CODE、ClassReader.SKIP_DEBUG、ClassReader.SKIP_FRAMES、ClassReader.EXPAND_FRAMES的组合值，
        // 也可以设置为0，可以打印出详细程度不同的信息。
        int parsingOptions = ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG;
        // asmCode值设置为true或false。如果是true，可以打印出对应的ASM代码；如果是false，可以打印出方法对应的Instruction。
        boolean asmCode = true;
        Printer printer = asmCode ? new ASMifier() : new Textifier();
        PrintWriter printWriter = new PrintWriter(System.out, true);
        TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, printer, printWriter);
        new ClassReader(className).accept(traceClassVisitor, parsingOptions);
    }
}
